/* Copyright (c) [2023] [ylc]. Licensed under Apache-2.0 License. */

#include "my_ws2812b.h"

WS2812B_COLOR_T PixelBuf[PIXEL_NUM]; //像素数据


void my_2812_init(void)
{
	u8 i;
	WS2812B_COLOR_T temp;
	
	P0CON|= (1<<0);

	temp.color.R=0;
	temp.color.G=0;
	temp.color.B=0;
	ws2812b_reset();

	for(i=0;i<PIXEL_NUM;i++){
		ws2812b_write_color(&temp);
	}
}

void ws2812b_reset(void)          //复位函数 50us
{
	u16 i;
	WS2812B_L();
	for(i=0;i<500;i++){
		DELAY_100NS();
	}
}

void ws2812b_write_byte(u8 dat)
{
	u8 i;
	for (i=0;i<8;i++)
	{
		//先发送高位
		if (dat & 0x80) //1
		{
			WS2812B_H();
			DELAY_850NS(); //T1H
			WS2812B_L();	
			DELAY_100NS(); //T1L
		}
		else	//0
		{
			WS2812B_H();
			DELAY_100NS(); //T0H
			WS2812B_L();	
			DELAY_850NS(); //T0L
		}
		dat<<=1;
	}
}


void ws2812b_write_color(WS2812B_COLOR_T *pColor)
{
	ws2812b_write_byte(pColor->color.G*0.2);		//整体降低了亮度
	ws2812b_write_byte(pColor->color.R*0.2);
	ws2812b_write_byte(pColor->color.B*0.2);
}


void ws2812b_refresh(void)
{
	u8 i;
	for(i=0;i<PIXEL_NUM;i++)
	{
		ws2812b_write_color(&PixelBuf[i]);
	}
}

//--测试代码--------------------------------------

void ws2812b_init(void)
{
	PixelBuf[0].color.B=100;
	PixelBuf[0].color.R=0;
	PixelBuf[0].color.G=0;
	PixelBuf[1].color.B=75;
	PixelBuf[1].color.R=25;
	PixelBuf[1].color.G=0;
	PixelBuf[2].color.B=50;
	PixelBuf[2].color.R=50;
	PixelBuf[2].color.G=0;
	PixelBuf[3].color.B=25;
	PixelBuf[3].color.R=75;
	PixelBuf[3].color.G=0;
	
	PixelBuf[4].color.R=100;
	PixelBuf[4].color.G=0;
	PixelBuf[4].color.B=0;
	PixelBuf[5].color.R=75;
	PixelBuf[5].color.G=25;
	PixelBuf[5].color.B=0;
	PixelBuf[6].color.R=50;
	PixelBuf[6].color.G=50;
	PixelBuf[6].color.B=0;
	PixelBuf[7].color.R=25;
	PixelBuf[7].color.G=75;
	PixelBuf[7].color.B=0;
	
	PixelBuf[8].color.G=100;
	PixelBuf[8].color.B=0;
	PixelBuf[8].color.R=0;
	PixelBuf[9].color.G=75;
	PixelBuf[9].color.B=25;
	PixelBuf[9].color.R=0;
	PixelBuf[10].color.G=50;
	PixelBuf[10].color.B=50;
	PixelBuf[10].color.R=0;
	PixelBuf[11].color.G=25;
	PixelBuf[11].color.B=75;
	PixelBuf[11].color.R=0;
}

void ws2812b_test(void)
{
	u16 i,type=0;
	WS2812B_COLOR_T temp;
	temp=PixelBuf[0];
	for(i=0;i<PIXEL_NUM-1;i++){
		PixelBuf[i]=PixelBuf[i+1];
	}
	PixelBuf[PIXEL_NUM-1]=temp;
	for(i=0;i<PIXEL_NUM;i++){
		ws2812b_write_color(&PixelBuf[i]);
	}
	
//	temp.R=0;
//	temp.G=255;
//	temp.B=255;
//	
//	for(i=0;i<PIXEL_NUM;i++){
//		ws2812b_write_color(&temp);
//	}
}



